package view;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.net.URL;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;

import statistiche.StatisticaCliente;
import utilities.BibliotecaJDBC;
import utilities.JPanel2;
import utilities.JTable2;
import controller.ControllerClienteImpl;

public class UtenteView extends JFrame {

	/**
	 * elenco variabili di classe
	 */
	private static final long serialVersionUID = 3793538683195885524L;
	private Dimension dimensioneUtente = new Dimension(1050, 650);
	private Point centroAssi = new Point(
			((int) Toolkit.getDefaultToolkit().getScreenSize().getWidth() - dimensioneUtente.width) / 2,
			((int) Toolkit.getDefaultToolkit().getScreenSize().getHeight() - dimensioneUtente.height) / 2);

	private MainView mw;
	private Cursor cursore = new Cursor(Cursor.HAND_CURSOR);
	private Font varie = new Font("Comic san MS", Font.ITALIC, 30);
	private JButton storico, rinnovaPrestito, esci, cambiaMail, cercaLibro,
			help, confermaCambiaMail, vaiIndietroInUtenteView,
			confermaCercaLibro, indietroCercaLibro, avantiCercaLibro,
			confermaRinnovo, indietroRinnovaPrestito;
	private JFrame frameCambiaMail, frameStoricoCliente, frameCercaLibro,
			frameRinnovaPrestito, frameTabellaCercaLibro;
	private ImageIcon sfondo = new ImageIcon("immagini/sfondogrande.jpg");
	private ImageIcon sfondoNormale = new ImageIcon("immagini/sfondo1.jpg");
	private ImageIcon erroreIm = new ImageIcon("immagini/bookerror.png");
	private ImageIcon okIm = new ImageIcon("immagini/libro.png");
	private ImageIcon puntoInterrogativo = new ImageIcon(
			"immagini/puntoInterrogativo.gif");
	private ListenerUserView listenerBottoni = new ListenerUserView();

	private ControllerClienteImpl controller;
	private JTextField vecchiaMail, nuovaMail, titoloCercaLibro,
			genereCercaLibro, casaEditriceCercaLibro, autoreCercaLibro,
			fieldIsbn;
	private JMenu statisticheDisponibili, visualizzaStorico;
	private JMenuBar menuBar;
	private JMenuItem statisticaMensile, statisticaAnnuale,
			statisticaGeneriPreferiti, menuHelp, menuIndietro, piuDatati,
			menoDatati, stessoGenere, stessaCasaEditrice;
	private StatisticaCliente statistiche;
	private JPanel pannelloStatistiche;

	/*
	 * inizio costruttore
	 */
	public UtenteView(MainView mw, ControllerClienteImpl controller) {
		this.controller = controller;
		this.mw = mw;
		statistiche = new StatisticaCliente(BibliotecaJDBC.getConnection(),
				mw.getIdAccesso());
		inizializza();

	}

	/*
	 * fine costruttore
	 */

	/*
	 * inizio costruzione della finestra principale
	 */
	private void inizializza() {

		// Immagini

		ImageIcon imLogout = new ImageIcon("immagini/logout.gif");
		ImageIcon imHelp = new ImageIcon("immagini/help.png");
		ImageIcon imStorico = new ImageIcon("immagini/storico.png");
		ImageIcon imCercaLibro = new ImageIcon("immagini/cercaLibro.png");
		ImageIcon imCambiaMail = new ImageIcon("immagini/cambiaMail.png");

		ImageIcon imRinnovoPrestito = new ImageIcon(
				"immagini/rinnovoPrestito.png");

		// i jpanel

		JPanel pannelloMain = new JPanel2(sfondo.getImage());
		pannelloMain.setLayout(new GridLayout(4, 4));

		// aggiungo i pannelli
		this.add(pannelloMain);

		// vari bottoni

		storico = new JButton(imStorico);
		storico.setToolTipText("Statistiche");
		cambiaMail = new JButton(imCambiaMail);
		cambiaMail.setToolTipText("Cambia la tua e-mail");
		rinnovaPrestito = new JButton(imRinnovoPrestito);
		rinnovaPrestito.setToolTipText("Rinnova un prestito");
		cercaLibro = new JButton(imCercaLibro);
		cercaLibro.setToolTipText("Cerca un Libro");
		help = new JButton(imHelp);
		help.setToolTipText("Help");
		esci = new JButton(imLogout);
		esci.setToolTipText("Esci");

		storico.setCursor(cursore);
		cambiaMail.setCursor(cursore);
		rinnovaPrestito.setCursor(cursore);
		cercaLibro.setCursor(cursore);
		help.setCursor(cursore);
		esci.setCursor(cursore);

		// dichiaro i bottoni vuoti

		JButton n1 = new JButton();
		n1.setVisible(false);
		JButton n2 = new JButton();
		n2.setVisible(false);
		JButton n3 = new JButton();
		n3.setVisible(false);
		JButton n4 = new JButton();
		n4.setVisible(false);
		JButton n5 = new JButton();
		n5.setVisible(false);
		JButton n6 = new JButton();
		n6.setVisible(false);
		JButton n7 = new JButton();
		n7.setVisible(false);
		JButton n8 = new JButton();
		n8.setVisible(false);
		JButton n9 = new JButton();
		n9.setVisible(false);
		JButton n10 = new JButton();
		n10.setVisible(false);

		// aggiungo i bottoni

		pannelloMain.add(n1);
		pannelloMain.add(n2);
		pannelloMain.add(n3);
		pannelloMain.add(n4);
		pannelloMain.add(storico);
		pannelloMain.add(n5);
		pannelloMain.add(n6);
		pannelloMain.add(cambiaMail);
		pannelloMain.add(n7);
		pannelloMain.add(rinnovaPrestito);
		pannelloMain.add(cercaLibro);
		pannelloMain.add(n8);
		pannelloMain.add(help);
		pannelloMain.add(n9);
		pannelloMain.add(n10);
		pannelloMain.add(esci);

		// applico il listener

		esci.addActionListener(listenerBottoni);
		storico.addActionListener(listenerBottoni);
		cambiaMail.addActionListener(listenerBottoni);
		rinnovaPrestito.addActionListener(listenerBottoni);
		help.addActionListener(listenerBottoni);
		cercaLibro.addActionListener(listenerBottoni);

		KeyListenerView keylistener = new KeyListenerView();
		this.addKeyListener(keylistener);
		esci.addKeyListener(keylistener);
		storico.addKeyListener(keylistener);
		cambiaMail.addKeyListener(keylistener);
		rinnovaPrestito.addKeyListener(keylistener);
		help.addKeyListener(keylistener);
		cercaLibro.addKeyListener(keylistener);

		// inizioFinestra
		this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		this.setVisible(true);
		this.setTitle("Biblioteca");
		this.setSize(new Dimension(1366, 730));
		this.setPreferredSize(new Dimension(1366, 730));
		this.setResizable(false);
		this.setFocusable(true);

	}

	/*
	 * fine costruzione della finestra principale
	 */

	/*
	 * inizio metodiPrincipali di UtenteView 4 metodi
	 */

	/*
	 * inizio metodoPrincipale 1 : cambia mail
	 */
	private void apriCambiaMail() {

		frameCambiaMail = new JFrame("Cambia Mail");
		frameCambiaMail.setSize(dimensioneUtente);
		frameCambiaMail.setLocation(centroAssi);
		frameCambiaMail.setLayout(new GridLayout(2, 1));
		frameCambiaMail.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		ImageIcon imCambiaMail = new ImageIcon("immagini/libripiccoladef.gif");
		JPanel2 pannelloSopra = new JPanel2(imCambiaMail.getImage());
		JPanel pannelloCambiaMail = new JPanel(new GridLayout(3, 1));
		ImageIcon imConfermaCambiaMail = new ImageIcon("immagini/conferma.gif");
		vecchiaMail = new JTextField("Nuova mail");
		nuovaMail = new JTextField("Ripeti mail");
		confermaCambiaMail = new JButton(imConfermaCambiaMail);
		confermaCambiaMail.addActionListener(listenerBottoni);
		frameCambiaMail.add(pannelloSopra);
		frameCambiaMail.add(pannelloCambiaMail);
		frameCambiaMail.setLocation(300, 300);
		frameCambiaMail.setSize(600, 400);
		frameCambiaMail.setResizable(false);
		pannelloCambiaMail.add(vecchiaMail);
		pannelloCambiaMail.add(nuovaMail);
		pannelloCambiaMail.add(confermaCambiaMail);

		KeyListenerCambiaEmail listenerTasti = new KeyListenerCambiaEmail();
		frameCambiaMail.addKeyListener(listenerTasti);
		vecchiaMail.addKeyListener(listenerTasti);
		nuovaMail.addKeyListener(listenerTasti);
		confermaCambiaMail.addKeyListener(listenerTasti);

		frameCambiaMail.setVisible(true);

	}

	/*
	 * fine metodoPrincipale 1 : cambia mail
	 */

	/*
	 * inizio metodoPrincipale 2 : storicoCliente
	 */
	private void apriStoricoCliente() {

		// i componenti
		frameStoricoCliente = new JFrame("Storico Cliente");
		frameStoricoCliente.setSize(dimensioneUtente);
		frameStoricoCliente.setLocation(centroAssi);
		frameStoricoCliente.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		frameStoricoCliente.setResizable(false);
		frameStoricoCliente.setFocusable(true);
		pannelloStatistiche = new JPanel2(sfondoNormale.getImage());
		pannelloStatistiche.setLayout(new BorderLayout());
		menuBar = new JMenuBar();
		statisticheDisponibili = new JMenu("Statistiche disponibili:   ");
		visualizzaStorico = new JMenu("   Cerca prestiti per:   ");
		menuHelp = new JMenuItem("  Help");
		menuIndietro = new JMenuItem("  Indietro");
		statisticaAnnuale = new JMenuItem("   Annuale   ");
		statisticaMensile = new JMenuItem("   Mensile   ");
		statisticaGeneriPreferiti = new JMenuItem("   Generi   ");
		piuDatati = new JMenuItem("Meno datati");
		menoDatati = new JMenuItem("Piu' datati");
		stessoGenere = new JMenuItem("Genere");
		stessaCasaEditrice = new JMenuItem("Casa Editrice");

		// aggiungo i componenti
		frameStoricoCliente.add(pannelloStatistiche);
		frameStoricoCliente.add(menuBar, BorderLayout.SOUTH);
		statisticheDisponibili.add(statisticaAnnuale);
		statisticheDisponibili.addSeparator();
		statisticheDisponibili.add(statisticaMensile);
		statisticheDisponibili.addSeparator();
		statisticheDisponibili.add(statisticaGeneriPreferiti);
		visualizzaStorico.add(menoDatati);
		visualizzaStorico.addSeparator();
		visualizzaStorico.add(piuDatati);
		visualizzaStorico.addSeparator();
		visualizzaStorico.add(stessoGenere);
		visualizzaStorico.addSeparator();
		visualizzaStorico.add(stessaCasaEditrice);
		menuBar.add(statisticheDisponibili);
		menuBar.add(visualizzaStorico);
		menuBar.add(menuHelp);
		menuBar.add(menuIndietro);

		// le .set(...)

		statisticheDisponibili.setBackground(Color.yellow);
		visualizzaStorico.setBackground(Color.red);
		menuHelp.setBackground(Color.green);
		menuIndietro.setBackground(Color.cyan);
		menoDatati.setBackground(Color.red);
		piuDatati.setBackground(Color.red);
		stessoGenere.setBackground(Color.red);
		stessaCasaEditrice.setBackground(Color.red);
		statisticaAnnuale.setBackground(Color.yellow);
		statisticaMensile.setBackground(Color.yellow);
		statisticaGeneriPreferiti.setBackground(Color.yellow);
		statisticaAnnuale
				.setToolTipText("Visualizza la statistica dei tuoi prestiti annuali");
		statisticaMensile
				.setToolTipText("Visualizza la statistica dei tuoi prestiti mensili");
		statisticaGeneriPreferiti
				.setToolTipText("Visualizza la statistica dei tuoi generi preferiti");
		menoDatati
				.setToolTipText("Visualizza lo storico dei tuoi prestiti in crescente in base alla data di inizio prestito ");
		piuDatati
				.setToolTipText("Visualizza lo storico dei tuoi prestiti in crescente in base alla data di inizio prestito ");
		stessoGenere
				.setToolTipText("Visualizza lo storico dei tuoi prestiti ordinati in base al genere ");
		stessaCasaEditrice
				.setToolTipText("Visualizza lo storico dei tuoi prestiti ordinati in base alla casa editrice ");
		menuHelp.setToolTipText("Cerchi aiuto?");
		menuIndietro.setToolTipText("Vai alla tua Home");

		// aggiungo il listener
		statisticaMensile.addActionListener(listenerBottoni);
		statisticaAnnuale.addActionListener(listenerBottoni);
		statisticaGeneriPreferiti.addActionListener(listenerBottoni);
		menuHelp.addActionListener(listenerBottoni);
		menuIndietro.addActionListener(listenerBottoni);
		piuDatati.addActionListener(listenerBottoni);
		menoDatati.addActionListener(listenerBottoni);
		stessoGenere.addActionListener(listenerBottoni);
		stessaCasaEditrice.addActionListener(listenerBottoni);

		KeyListenerStatistiche keylistener = new KeyListenerStatistiche();
		statisticaMensile.addKeyListener(keylistener);
		statisticaAnnuale.addKeyListener(keylistener);
		statisticaGeneriPreferiti.addKeyListener(keylistener);
		menuHelp.addKeyListener(keylistener);
		menuIndietro.addKeyListener(keylistener);
		piuDatati.addKeyListener(keylistener);
		menoDatati.addKeyListener(keylistener);
		stessoGenere.addKeyListener(keylistener);
		stessaCasaEditrice.addKeyListener(keylistener);
		frameStoricoCliente.addKeyListener(keylistener);

		frameStoricoCliente.setVisible(true);

	}

	/*
	 * fine metodoPrincipale 2 : storicoCliente
	 */

	/*
	 * inizio metodoPrincipale 3 : cercaLibro
	 */
	private void apriCercaLibro() {
		// inizializzo i componenti
		JPanel pannelloPrincipale = new JPanel2(sfondoNormale.getImage());
		JPanel pannelloSecondario = new JPanel(new GridLayout(3, 4, 15, 40));
		JPanel pannelloConsigliati = new JPanel();
		JPanel consigliato1 = new JPanel();
		JPanel consigliato2 = new JPanel();
		JPanel consigliato3 = new JPanel();
		JLabel autore = new JLabel("Autore", JLabel.CENTER);
		JLabel titolo = new JLabel("Titolo", JLabel.CENTER);
		JLabel genere = new JLabel("Genere", JLabel.CENTER);
		JLabel casaEditrice = new JLabel("Casa editrice", JLabel.CENTER);
		JButton n = new JButton();
		JButton n1 = new JButton();
		ImageIcon indietro = new ImageIcon("immagini/indietro.png");
		ImageIcon avanti = new ImageIcon("immagini/conferma.gif");
		ImageIcon[] immaginiLibriConsigliati = new ImageIcon[3];
		JLabel[] lableScritteConsigliati = new JLabel[3];
		JLabel[] labelImmaginiConsigliati = new JLabel[3];
		frameCercaLibro = new JFrame("Cerca Libro");
		titoloCercaLibro = new JTextField();
		autoreCercaLibro = new JTextField();
		genereCercaLibro = new JTextField();
		casaEditriceCercaLibro = new JTextField();
		indietroCercaLibro = new JButton(indietro);
		avantiCercaLibro = new JButton(avanti);

		// le add
		frameCercaLibro.add(pannelloPrincipale);
		frameCercaLibro.add(pannelloConsigliati);
		frameCercaLibro.add(pannelloSecondario);
		pannelloConsigliati.add(consigliato1);
		pannelloConsigliati.add(consigliato2);
		pannelloConsigliati.add(consigliato3);
		pannelloSecondario.add(titolo);
		pannelloSecondario.add(titoloCercaLibro);
		pannelloSecondario.add(autore);
		pannelloSecondario.add(autoreCercaLibro);
		pannelloSecondario.add(genere);
		pannelloSecondario.add(genereCercaLibro);
		pannelloSecondario.add(casaEditrice);
		pannelloSecondario.add(casaEditriceCercaLibro);
		pannelloSecondario.add(indietroCercaLibro);
		pannelloSecondario.add(n);
		pannelloSecondario.add(n1);
		pannelloSecondario.add(avantiCercaLibro);

		// listener bottoni/tasti
		KeyListenerCercaLibro keylistener = new KeyListenerCercaLibro();
		titoloCercaLibro.addKeyListener(keylistener);
		genereCercaLibro.addKeyListener(keylistener);
		casaEditriceCercaLibro.addKeyListener(keylistener);
		autoreCercaLibro.addKeyListener(keylistener);
		avantiCercaLibro.addKeyListener(keylistener);
		indietroCercaLibro.addKeyListener(keylistener);
		avantiCercaLibro.addActionListener(listenerBottoni);
		indietroCercaLibro.addActionListener(listenerBottoni);

		// disegno il pannello Consigliati
		try {
			ResultSet res = controller.getConsigliati(mw.getIdAccesso());
			int pos = 0;
			while (res.next() != false && pos < 3) {
				String url = res.getString("url");

				if (!url.equals("null")) {
					URL link = new URL(url);
					immaginiLibriConsigliati[pos] = new ImageIcon(link);
					Image x = immaginiLibriConsigliati[pos].getImage();
					x = x.getScaledInstance(100, 150, Image.SCALE_DEFAULT);
					immaginiLibriConsigliati[pos].setImage(x);
				} else {
					immaginiLibriConsigliati[pos] = new ImageIcon(
							"libri/questionmark.gif");
				}
				StringBuilder sb = new StringBuilder();
				sb.append("<html><p align=''center''>");
				sb.append(res.getString("titolo"));
				sb.append("<br> Di ");
				sb.append(res.getString("autore"));
				sb.append("</p></html>");
				lableScritteConsigliati[pos] = new JLabel(sb.toString(),
						JLabel.CENTER);
				lableScritteConsigliati[pos].setFont(new Font("Comic Sans Ms",
						Font.BOLD, 18));
				labelImmaginiConsigliati[pos] = new JLabel(
						immaginiLibriConsigliati[pos], JLabel.CENTER);
				if (pos == 0) {
					consigliato1.add(labelImmaginiConsigliati[pos]);
					consigliato1.add(lableScritteConsigliati[pos]);
				} else if (pos == 1) {
					consigliato2.add(labelImmaginiConsigliati[pos]);
					consigliato2.add(lableScritteConsigliati[pos]);
				} else if (pos == 2) {
					consigliato3.add(labelImmaginiConsigliati[pos]);
					consigliato3.add(lableScritteConsigliati[pos]);
				}
				pos++;
			}
		} catch (SQLException s) {
		} catch (NullPointerException np) {
		} catch (IOException ex) {
		}

		// le set
		frameCercaLibro.setSize(dimensioneUtente);
		frameCercaLibro.setLayout(new GridLayout(3, 1));
		frameCercaLibro.setLocation(centroAssi);
		frameCercaLibro.setResizable(false);
		frameCercaLibro.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		pannelloConsigliati.setLayout(new GridLayout(1, 3));
		consigliato1.setLayout(new GridLayout(1, 2));
		consigliato2.setLayout(new GridLayout(1, 2));
		consigliato3.setLayout(new GridLayout(1, 2));
		titolo.setFont(varie);
		autore.setFont(varie);
		genere.setFont(varie);
		casaEditrice.setFont(varie);
		n.setVisible(false);
		n1.setVisible(false);
		frameCercaLibro.setVisible(true);
	}

	/*
	 * fine metodoPrincipale 3 : cercaLibro
	 */
	/*
	 * inizio metodo principale 4 :aggiornaprestito
	 */
	public void apriFrameRinnovoPrestito() {

		frameRinnovaPrestito = new JFrame("Rinnovo Prestito");
		frameRinnovaPrestito.setSize(400, 400);
		frameRinnovaPrestito.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		frameRinnovaPrestito.setLocation(centroAssi);
		frameRinnovaPrestito.setResizable(false);
		Font font = new Font("COMIC SANS MS", Font.PLAIN, 22);

		JPanel pannelloRinnovoPrestito = new JPanel2(sfondoNormale.getImage());
		JPanel pannelloTornaIndietro = new JPanel(new GridLayout(1, 2));
		ImageIcon avanti = new ImageIcon("immagini/conferma.gif");
		fieldIsbn = new JTextField("INSERISCI ISBN");
		fieldIsbn.setFont(font);
		indietroRinnovaPrestito = new JButton(new ImageIcon(
				"immagini/indietro.png"));
		confermaRinnovo = new JButton(avanti);
		frameRinnovaPrestito.add(pannelloRinnovoPrestito);
		pannelloRinnovoPrestito.setLayout(new GridLayout(2, 1));
		pannelloRinnovoPrestito.add(pannelloTornaIndietro);
		pannelloRinnovoPrestito.add(fieldIsbn);
		pannelloTornaIndietro.add(confermaRinnovo);
		pannelloTornaIndietro.add(indietroRinnovaPrestito);

		KeyListenerRinnovoPrestito keylistener = new KeyListenerRinnovoPrestito();
		fieldIsbn.addKeyListener(keylistener);
		confermaRinnovo.addKeyListener(keylistener);
		indietroRinnovaPrestito.addKeyListener(keylistener);
		confermaRinnovo.addActionListener(listenerBottoni);
		indietroRinnovaPrestito.addActionListener(listenerBottoni);

		frameRinnovaPrestito.setVisible(true);

	}

	/*
	 * fine metodo principale 4 :consigliamiunlibro
	 */
	/*
	 * fine metodiPrincipali
	 */

	/*
	 * inizio metodi di supporto grafico ai 3 metodi principali sopra citati
	 */

	/*
	 * inizio metodo di supporto al cercaLibro
	 */
	private void apriFinestraCercaLibro() {
		try {
			String[] parametriInseriti = new String[4];
			try {
				parametriInseriti[0] = titoloCercaLibro.getText().trim();

			} catch (NullPointerException n) {
				parametriInseriti[0] = "";
			}
			try {
				parametriInseriti[1] = autoreCercaLibro.getText().trim();
			} catch (NullPointerException n) {
				parametriInseriti[1] = "";
			}
			try {
				parametriInseriti[2] = genereCercaLibro.getText().trim();
			} catch (NullPointerException n) {
				parametriInseriti[2] = "";
			}
			try {
				parametriInseriti[3] = casaEditriceCercaLibro.getText().trim();
			} catch (NullPointerException n) {
				parametriInseriti[3] = "";
			}

			ResultSet res = controller.cercaLibro(parametriInseriti);
			JTable2 jt2 = new JTable2(res);
			JTable tabella = jt2.riempiTabellaCercaLibroCliente();
			frameTabellaCercaLibro = new JFrame("CERCA LIBRO");
			JScrollPane scroll = new JScrollPane(tabella);
			JPanel panelCercaLibro = new JPanel2(sfondoNormale.getImage());
			panelCercaLibro.setLayout(new BorderLayout());
			frameTabellaCercaLibro.setSize(dimensioneUtente);
			frameTabellaCercaLibro.setVisible(true);
			frameTabellaCercaLibro.setLocation(centroAssi);
			frameTabellaCercaLibro.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
			frameTabellaCercaLibro.setFocusable(true);
			scroll.createHorizontalScrollBar();
			scroll.createVerticalScrollBar();
			panelCercaLibro.add(scroll, BorderLayout.CENTER);
			panelCercaLibro.add(indietroCercaLibro, BorderLayout.SOUTH);
			frameTabellaCercaLibro.add(panelCercaLibro);

			// listener
			KeyListenerTabellaCercaLibro keylistener = new KeyListenerTabellaCercaLibro();
			frameTabellaCercaLibro.addKeyListener(keylistener);
		} catch (SQLException q) {

		} catch (NullPointerException e) {

		}
	}

	/*
	 * fine metodo di supporto al cercaLibro
	 */

	/*
	 * inizio metodi di supporto Statistica 3 metodi
	 */

	/*
	 * inizio metodo 1 di supporto Statistica
	 */
	public void apriStatisticaAnnuale() {
		try {
			pannelloStatistiche.removeAll();
			pannelloStatistiche.add(statistiche.getStatisticaAnnuale(),
					BorderLayout.CENTER);
		} catch (SQLException sqe) {
			erroreStatisticaCliente();

		} catch (IllegalArgumentException il) {
		}
		aggiornaPannelloStatisticheCliente();
	}

	/*
	 * fine metodo 1 di supporto Statistica
	 */

	/*
	 * inizio metodo 2 di supporto Statistica
	 */
	public void apriStatisticaMensile() {
		try {
			pannelloStatistiche.removeAll();
			pannelloStatistiche.add(statistiche.getStatisticaMensile(),
					BorderLayout.CENTER);

		} catch (SQLException sqe) {
			erroreStatisticaCliente();
		} catch (IllegalArgumentException il) {
		}

		aggiornaPannelloStatisticheCliente();
	}

	/*
	 * fine metodo 2 di supporto Statistica
	 */
	/*
	 * inizio metodo 3 di supporto Statistica
	 */
	public void apriStatisticaGeneri() {
		try {
			pannelloStatistiche.removeAll();
			pannelloStatistiche.add(statistiche.getStatisticaGeneri(),
					BorderLayout.CENTER);

		} catch (SQLException sqe) {
			erroreStatisticaCliente();
		} catch (IllegalArgumentException il) {
		}

		aggiornaPannelloStatisticheCliente();
	}

	/*
	 * fine metodo 3 di supporto Statistica
	 */

	/*
	 * fine metodi di supporto Statistica
	 */

	/*
	 * inizio metodi di supporto Storico CLiente 4 metodi
	 */
	/*
	 * inizio metodo 1 di supporto Storico Cliente
	 */
	public void apriPiuDatati() {

		JTable2 jt2;
		try {

			ResultSet res = controller.visualizzaStorico("inizioPrestito DESC");
			jt2 = new JTable2(res);
			JTable tabella = jt2.riempiTabellaVistaDalCliente();
			JScrollPane scroll = new JScrollPane(tabella);
			scroll.createHorizontalScrollBar();
			scroll.createVerticalScrollBar();
			pannelloStatistiche.removeAll();
			pannelloStatistiche.add(scroll, BorderLayout.CENTER);
		} catch (SQLException e) {
			erroreStatisticaCliente();
		}

		aggiornaPannelloStatisticheCliente();

	}

	/*
	 * fine metodo 1 di supporto Storico Cliente
	 */
	/*
	 * inizio metodo 2 di supporto Storico Cliente
	 */
	public void apriMenoDatati() {
		ResultSet res = controller.visualizzaStorico("inizioPrestito");
		JTable2 jt2;
		try {
			jt2 = new JTable2(res);

			JTable tabella = jt2.riempiTabellaVistaDalCliente();
			JScrollPane scroll = new JScrollPane(tabella);
			scroll.createHorizontalScrollBar();
			scroll.createVerticalScrollBar();
			pannelloStatistiche.removeAll();
			pannelloStatistiche.add(scroll, BorderLayout.CENTER);
		} catch (SQLException e) {
			e.printStackTrace();
		}

		aggiornaPannelloStatisticheCliente();
	}

	/*
	 * fine metodo 2 di supporto Storico Cliente
	 */
	/*
	 * inizio metodo 3 di supporto Storico Cliente
	 */
	public void apriStessaCasaEditrice() {
		ResultSet res = controller.visualizzaStorico(" casaEditrice ");
		JTable2 jt2;
		try {
			jt2 = new JTable2(res);

			JTable tabella = jt2.riempiTabellaVistaDalCliente();
			JScrollPane scroll = new JScrollPane(tabella);
			scroll.createHorizontalScrollBar();
			scroll.createVerticalScrollBar();
			pannelloStatistiche.removeAll();
			pannelloStatistiche.add(scroll, BorderLayout.CENTER);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		aggiornaPannelloStatisticheCliente();

	}

	/*
	 * fine metodo 3 di supporto Storico Cliente
	 */
	/*
	 * inizio metodo 4 di supporto Storico Cliente
	 */
	public void apriStessoGenere() {
		ResultSet res = controller.visualizzaStorico(" genere ");
		JTable2 jt2;
		try {
			jt2 = new JTable2(res);

			JTable tabella = jt2.riempiTabellaVistaDalCliente();
			JScrollPane scroll = new JScrollPane(tabella);
			scroll.createHorizontalScrollBar();
			scroll.createVerticalScrollBar();
			pannelloStatistiche.removeAll();
			pannelloStatistiche.add(scroll, BorderLayout.CENTER);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		aggiornaPannelloStatisticheCliente();

	}

	/*
	 * fine metodo 4 di supporto Storico Cliente
	 */
	/*
	 * fine metodi di supporto Storico CLiente 4 metodi
	 */

	/*
	 * fine metodi grafici
	 */

	/*
	 * errori e metodi occasionali
	 */

	private void erroreStatisticaCliente() {
		JOptionPane.showMessageDialog(null, "Statistica non disponibile", null,
				JOptionPane.ERROR_MESSAGE, erroreIm);
	}

	public void cambioMailNonEffettuato() {
		JOptionPane.showMessageDialog(null,
				"Hai inserito una email sbagliata!", null,
				JOptionPane.ERROR_MESSAGE, erroreIm);

	}

	public void cambioMailEffettuato() {
		JOptionPane.showMessageDialog(null, "Email cambiata con successo!",
				null, JOptionPane.ERROR_MESSAGE, okIm);
		frameCambiaMail.dispose();
		this.setVisible(true);

	}

	private void aggiornaPannelloStatisticheCliente() {
		pannelloStatistiche.repaint();
		pannelloStatistiche.validate();

	}

	/*
	 * private void parametriScorretti() { JOptionPane .showMessageDialog( null,
	 * "Hai inserito parametri di ricerca sbagliata! \nParametri di un solo carattere non vengono considerati."
	 * , null, JOptionPane.ERROR_MESSAGE, erroreIm);
	 * 
	 * }
	 */

	public void togliCercaLibro() {
		frameCercaLibro.dispose();

	}

	public void togliCambiaMail() {
		frameCambiaMail.dispose();

	}

	public void erroreComunicazioneUtente(boolean socket) {
		if (socket) {
			JOptionPane.showMessageDialog(null,

			"Errore di comunicazione col Server ", null,
					JOptionPane.ERROR_MESSAGE, erroreIm);
		} else {
			int option = JOptionPane.showConfirmDialog(null,
					"Sei Disconnesso . Vuoi Riconnetterti?", "Exit Message",
					JOptionPane.YES_NO_OPTION, JOptionPane.YES_NO_OPTION,
					puntoInterrogativo);
			if (option == JOptionPane.YES_OPTION) {
				controller.accedi(mw.getIdAccesso(), mw.getPasswordAccesso());
			} else {
				dispose();
				mw.rendiVisibile();
			}

		}

	}

	public void nonPosssoAggiornarePrestito() {

		JOptionPane.showMessageDialog(null,
				"Siamo spiacenti, non possiamo aggiornare il tuo prestito.",
				null, JOptionPane.ERROR_MESSAGE, erroreIm);

	}

	public void limitiGiorniRaggiunti(int numeroGiorni) {

		JOptionPane.showMessageDialog(null,
				"Non puoi riprendere questo libro poiche' sei al giorno : "
						+ numeroGiorni, null, JOptionPane.ERROR_MESSAGE,
				erroreIm);

	}

	private void formatoIsbnRinnovaPrestitoSbagliato() {
		JOptionPane.showMessageDialog(null, "Hai inserito un ISBN errato . ",
				null, JOptionPane.ERROR_MESSAGE, erroreIm);
	}

	public void rinnovoPrestitoRiuscito() {
		JOptionPane.showMessageDialog(null,
				"Rinnovo libro " + Long.parseLong(fieldIsbn.getText())
						+ " avvenuto con successo . ", null,
				JOptionPane.ERROR_MESSAGE, okIm);

	}

	public void mailIncorretta() {
		JOptionPane.showMessageDialog(null, "Hai inserito una mail sbagliata!",
				null, JOptionPane.ERROR_MESSAGE, erroreIm);

	}

	/*
	 * fine metodi di supporto/occasionali
	 */
	/*
	 * inizio listener
	 */
	private class ListenerUserView implements ActionListener {

		public void actionPerformed(ActionEvent e) {
			if (e.getSource() == esci) {
				int option = JOptionPane.showConfirmDialog(null,
						"Sicuro di voler uscire?", "Exit Message",
						JOptionPane.YES_NO_OPTION, JOptionPane.YES_NO_OPTION,
						puntoInterrogativo);
				if (option == JOptionPane.YES_OPTION) {
					dispose();
					controller.chiudiConnessione();
					mw.rendiVisibile();
				}

			}// esci
			else if (e.getSource() == cercaLibro) {
				apriCercaLibro();

			}// cercaLibro

			else if (e.getSource() == storico) {
				apriStoricoCliente();

			}// storico

			else if (e.getSource() == help) {
				JOptionPane
						.showMessageDialog(
								null,
								"I servizi a tua disposizione sono : \n 1) Rinnovare un prestito per una sola volta di  15 giorni \n 2)Cambiare la tua e-mail \n 3)Vedere i grafici dei tuoi storici e visualizzare i tuoi prestiti nell'ordine che preferisci. \n 4) Cercare un libro .\n Buon Divertimento!",
								"TI SEI PERSO?",
								JOptionPane.INFORMATION_MESSAGE, erroreIm);

			}// help

			else if (e.getSource() == cambiaMail) {
				apriCambiaMail();

			}// cambiaMail
			else if (e.getSource() == confermaCambiaMail) {
				String oldMail = vecchiaMail.getText();
				String newMail = nuovaMail.getText();
				controller.cambiaMail(oldMail, newMail);

			}// confermaCambiaMail
			else if (e.getSource() == vaiIndietroInUtenteView) {
				frameCercaLibro.dispose();

			}// vaiIndietroInUtenteView
			else if (e.getSource() == confermaCercaLibro) {
				apriFinestraCercaLibro();
			}// confermaCercaLibro
			else if (e.getSource() == statisticaAnnuale) {
				apriStatisticaAnnuale();
			}// statisticaAnnuale
			else if (e.getSource() == statisticaMensile) {
				apriStatisticaMensile();
			}// statisticaMensile
			else if (e.getSource() == statisticaGeneriPreferiti) {
				apriStatisticaGeneri();
			}// statisticaGeneriPreferiti
			else if (e.getSource() == menuIndietro) {
				frameStoricoCliente.dispose();
				setVisible(true);
			}// menuIndietro
			else if (e.getSource() == piuDatati) {
				apriPiuDatati();
			}// piuDatati
			else if (e.getSource() == menoDatati) {
				apriMenoDatati();
			}// menoDatati
			else if (e.getSource() == stessaCasaEditrice) {
				apriStessaCasaEditrice();
			}// stessaCasaEditrice
			else if (e.getSource() == stessoGenere) {
				apriStessoGenere();
			}// stessoGenere
			else if (e.getSource() == avantiCercaLibro) {
				apriFinestraCercaLibro();

			}// avantiCercaLibro
			else if (e.getSource() == indietroCercaLibro) {
				frameCercaLibro.dispose();
				setVisible(true);

			}// indietroCercaLibro

			else if (e.getSource() == confermaRinnovo) {
				try {
					controller.aggiornaPrestito(Long.parseLong(fieldIsbn
							.getText()));

				} catch (NumberFormatException nfe) {
					formatoIsbnRinnovaPrestitoSbagliato();
				}
			}// confermaRinnovo
			else if (e.getSource() == indietroRinnovaPrestito) {
				frameRinnovaPrestito.dispose();

			}// indietroRinnovaPrestito
			else if (e.getSource() == rinnovaPrestito) {
				apriFrameRinnovoPrestito();
			}// rinnovaPrestito
			else if (e.getSource() == menuHelp) {
				JOptionPane
						.showMessageDialog(
								null,
								"Naviga nel tuo storico libri  \n Puoi visualizzare i grafici dei presititi effettuati nell'ordine che preferisci \n Vedere i libri presi in prestito in ordine alfabetico rispetto al genere o alla casa editrice.\n Buona navigazione!!!",
								"TI SEI PERSO?",
								JOptionPane.INFORMATION_MESSAGE, erroreIm);
			}

		}
	}

	private class KeyListenerCercaLibro implements KeyListener {

		@Override
		public void keyPressed(KeyEvent e) {
			int key = e.getKeyCode();
			if (key == KeyEvent.VK_ENTER) {
				apriFinestraCercaLibro();
			} else if (key == KeyEvent.VK_ESCAPE) {
				frameCercaLibro.dispose();
			}
		}

		@Override
		public void keyReleased(KeyEvent e) {

		}

		@Override
		public void keyTyped(KeyEvent e) {

		}
	}

	private class KeyListenerRinnovoPrestito implements KeyListener {

		@Override
		public void keyPressed(KeyEvent e) {
			int key = e.getKeyCode();
			if (key == KeyEvent.VK_ENTER) {
				try {
					controller.aggiornaPrestito(Long.parseLong(fieldIsbn
							.getText()));
				} catch (NumberFormatException nfe) {
					formatoIsbnRinnovaPrestitoSbagliato();
				}
			} else if (key == KeyEvent.VK_ESCAPE) {
				frameRinnovaPrestito.dispose();
			}
		}

		@Override
		public void keyReleased(KeyEvent e) {
			// TODO Auto-generated method stub

		}

		@Override
		public void keyTyped(KeyEvent e) {
			// TODO Auto-generated method stub

		}

	}

	private class KeyListenerCambiaEmail implements KeyListener {

		@Override
		public void keyPressed(KeyEvent e) {
			int key = e.getKeyCode();
			if (key == KeyEvent.VK_ESCAPE) {
				frameCambiaMail.dispose();
			} else if (key == KeyEvent.VK_ENTER) {
				String oldMail = vecchiaMail.getText();
				String newMail = nuovaMail.getText();
				controller.cambiaMail(oldMail, newMail);
			}
		}

		@Override
		public void keyReleased(KeyEvent e) {
		}

		@Override
		public void keyTyped(KeyEvent e) {
		}

	}

	private class KeyListenerStatistiche implements KeyListener {

		@Override
		public void keyPressed(KeyEvent e) {
			int key = e.getKeyCode();
			if (key == KeyEvent.VK_ESCAPE) {
				frameStoricoCliente.dispose();
			}
		}

		@Override
		public void keyReleased(KeyEvent e) {
		}

		@Override
		public void keyTyped(KeyEvent e) {
		}

	}

	private class KeyListenerTabellaCercaLibro implements KeyListener {

		@Override
		public void keyPressed(KeyEvent e) {
			int key = e.getKeyCode();
			if (key == KeyEvent.VK_ESCAPE) {
				frameTabellaCercaLibro.dispose();
			}
		}

		@Override
		public void keyReleased(KeyEvent e) {
		}

		@Override
		public void keyTyped(KeyEvent e) {
		}

	}

	private class KeyListenerView implements KeyListener {
		@Override
		public void keyTyped(KeyEvent e) {
		}

		@Override
		public void keyReleased(KeyEvent e) {
		}

		@Override
		public void keyPressed(KeyEvent e) {
			int key = e.getKeyCode();
			if (key == KeyEvent.VK_ESCAPE) {
				int option = JOptionPane.showConfirmDialog(null,
						"Sicuro di voler uscire ?", "Exit Message",
						JOptionPane.YES_NO_OPTION, JOptionPane.YES_NO_OPTION,
						puntoInterrogativo);
				if (option == JOptionPane.YES_OPTION) {
					dispose();
					mw.rendiVisibile();
				}

			}

		}
	}

	/*
	 * fine listener
	 */
	/*
	 * fine UtenteView
	 */

	public void inserireAlcuniParametri() {
		JOptionPane.showMessageDialog(null,
				"Inserire un parametro con lunghezza sufficiente", null,
				JOptionPane.ERROR_MESSAGE, erroreIm);

	}

}
